#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

typedef struct
{
    int* head;   //指针，存申请的内存的首地址
    int length;  //当前数据个数
    int size;    //元素个数（最大容量）
}Table;

Table expTable(Table* p)
{
    (*p).head=realloc((*p).head,((*p).size*=2)*sizeof(int));
    if(!(*p).head)
    {
        printf("内存扩容失败，程序终止！\n");
        return *p;
    }
}

Table initTable()
{
    Table t;
    //1、记录最大容量
    t.size=5;
    //2、记录最大容量
    t.length=0;
    //3、申请内存
    t.head=(int*)calloc(t.size,sizeof(int));
    if(!t.head)
    {
        printf("申请内存失败！程序终止！\n");
        exit(0);
    }
    return t;
}

void inputTable(Table* p,int num)
{
    if(num<1)
    {
        printf("长度错误\n");
    }
    else if(num<=(*p).size)
    {
        for(int i=0;i<num;i++)
        {
            //scanf("%d",myTab.head+i);
            (*p).head[i]=10+i;
            (*p).length++;
        }
        printf("inputTable:%d %d %X\n",(*p).size,(*p).length,(*p).head);
    }
    else
    {
        //扩容
        printf("超过最大容量,无法初始化数据！\n");       
        printf("开始扩容！\n");
        expTable(p);
        printf("扩容完成！\n");
        printf("inputTable:%d %d %X\n",(*p).size,(*p).length,(*p).head);
        printf("重新初始化数据完成！\n");
        inputTable(p,num);
        
    }

}

void displayTable(Table* p)
{
    Table table=*p;
    printf("displayTable:%d %d %X\n",table.size,table.length,table.head);
    for(int i=0;i<table.length;i++)
    {
        //&myTab.head[i]  &(myTab.head[i])  myTab.head+i
        //myTab.head[i]   *(myTab.head+i)
        printf("%d %X\n",table.head[i],table.head+i);
    }
}

Table addTable(Table* p,int val,int index)
{
    if(index<1|| (*p).length+1<index)
    {
        printf("位置错误，插入失败！\n");
        return *p;
    }
    if((*p).length>=(*p).size)
    {
        //扩容
        expTable(p);
    }
    for(int i=(*p).length-1;i>=index-1;i--)
    {
        (*p).head[i+1]=(*p).head[i];
    }
    (*p).head[index-1]=val;
    (*p).length++;
    return *p;
}

Table delTable(Table* p,int index)
{
    if(index<1 || index>p->length)
    {
        printf("删除位置错误！删除失败！\n");
        return *p;
    }
    for(int i=index;i<p->length;i++)
    {
        p->head[i-1]=p->head[i];
    }
    p->length--;
    return *p;
}

int selectTable(Table table,int val)
{
    for(int i=0;i<table.length;i++)
    {
        if(table.head[i]==val)
        {
            printf("查找到指定的元素：%d\n",val);
            return i+1;
        }
    }
    printf("未查找到指定的元素：%d\n",val);
    return -1;
}

Table changeTable_index(Table* p,int val,int index)
{
    if(index<1 || index>p->length)
    {
        printf("修改位置错误！修改失败！\n");
        return *p;
    }
    p->head[index-1]=val;
    return *p;
}

Table changeTable_val(Table* p,int val,int newVal)
{
    int index=selectTable(*p,val);
    if(index==-1)
    {
        printf("查找不到%d,修改失败\n",val);
        return *p;
    }
    p->head[index-1]=newVal;
    return *p;
}

int main()
{
    Table myTab=initTable();
    printf("initTable:%d %d %X\n",myTab.size,myTab.length,myTab.head);

    inputTable(&myTab,20);
    displayTable(&myTab);

    printf("指定位置插入数据，位置3，插入数据9\n");
    addTable(&myTab,9,3);
    displayTable(&myTab);

    printf("指定位置删除数据，删除位置2数据\n");
    delTable(&myTab,2);
    displayTable(&myTab);

    printf("指定位置查找数据，查找数据99\n");
    selectTable(myTab,99);

    printf("指定位置修改数据 位置3，修改为99\n");
    changeTable_index(&myTab,99,3);
    displayTable(&myTab);

    printf("修改指定数据，将19改为3\n");
    changeTable_val(&myTab,100,3);
    displayTable(&myTab);
	//system("pause");
	return 0;
} 